#ifndef __CE_GFX_GL20_PROGRAMPARAMETER_GL20_H__
#define __CE_GFX_GL20_PROGRAMPARAMETER_GL20_H__

#include <export.h>
#include <gfx/iprogramparameter.h>
#include <GL/glew.h>

/**
 * @brief OpenGL 2.0 implemenation of the iProgramParameter interface
 */
class ceProgramParameterGL20 : public iProgramParameter
{
	CE_OBJECT
private:
	GLint										_location;
	ceProgramParameterType  _type;

public:
	ceProgramParameterGL20 (GLint location, ceProgramParameterType type);
	virtual ~ceProgramParameterGL20 ();

	virtual void Bind (int x) ;
	virtual void Bind (int x, int y);
	virtual void Bind (int x, int y, int z);
	virtual void Bind (int x, int y, int z, int w);

	virtual void Bind (float x);
	virtual void Bind (float x, float y);
	virtual void Bind (float x, float y, float z);
	virtual void Bind (float x, float y, float z, float w);

	virtual void Bind (const ceVector2f& v);
	virtual void Bind (const ceVector3f& v);
	virtual void Bind (const ceVector4f& v);
	virtual void Bind (const ceColor4f& c);

	virtual void Bind (unsigned count, const float* v);
	virtual void Bind (unsigned count, const ceVector2f* v);
	virtual void Bind (unsigned count, const ceVector3f* v);
	virtual void Bind (unsigned count, const ceVector4f* v);
	virtual void Bind (unsigned count, const ceMatrix4f* m);

	virtual void Bind (const ceMatrix4f& m);

	virtual void Bind (int size, int stride, unsigned offset, ceDataType type);
	virtual void Bind (int size, int stride, const void* data, ceDataType type);
	virtual void Bind (int stride, const ceVector2f* vptr);
	virtual void Bind (int stride, const ceVector3f* vptr);
	virtual void Bind (int stride, const ceVector4f* vptr);

	virtual void Bind(ceTextureStage state, const iTexture2D* texture);

	virtual void Enable ();
	virtual void Disable ();
};


#endif // __CE_GFX_GL20_PROGRAMPARAMETER_GL20_H__
